<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 传入一个函数,将其改写为柯里化函数 
    // 传入的函数参数可以不受限制
    /* function currying(callback){
        var _args = []; // 用于存放所有参数(闭包)
        return function () { // 
            console.log(arguments); // [1]
            _args.push(...arguments); // Array.prototype.push.apply(_args,arguments);
            if(arguments.length == 0){  // 没有参数 最后一层 => 执行传入的回调函数
                console.log("最后一层",_args);
                // return callback(..._args);  // 如果参数传入完毕 => 调用原函数
                return callback.apply(null,_args);  // 如果参数传入完毕 => 调用原函数
            }
            return arguments.callee;
        }
    }


    function add(a,b,c){
        return a + b + c;
    }


    var sum = currying(add);
    console.log(sum);

    // var res = sum(1)(2)(3)();   // 三个参数
    // var res = sum(1)(2)(3)(4)(5)(6)();   // 6个参数
    var res = sum(1)(2)();   // 2个参数  =>  a:1  b:2  c:undefined  => NaN
    console.log("res",res); */


    // 注意:
    // 如果需要进行柯里化的函数,是参数版(已知需要接收n个参数) => 传入的参数需要和实际参数进行对比判断

    // 已经回调函数需要接收几个参数  => 如果不知道回调函数需要接收几个参数 => 不能使用此版本

    function currying(callback){
        var _args = []; // 用于存放所有参数(闭包)
        var len = callback.length; // 传入的回调函数需要接收的参数个数
        return function () { // 
            console.log(arguments); // [1]
            _args.push(...arguments); // Array.prototype.push.apply(_args,arguments);
            if(_args.length >= len){  // 参数已经够了,多传也没有用 => 执行传入的回调函数
                console.log("最后一层",_args);
                // return callback(..._args);  // 如果参数传入完毕 => 调用原函数
                return callback.apply(null,_args);  // 如果参数传入完毕 => 调用原函数
            }
            return arguments.callee;
        }
    }


    function add(a,b,c){
        return a + b + c;
    }
    console.dir(add);  // add.length => 3  此函数需要接收三个参数  


    var sum = currying(add);
    // console.log(sum);

    // var res = sum(1)(2)(3);   // 三个参数
    // var res = sum(1)(2)(3);   // 6个参数
    var res = sum(1)(2)()()()()(3);   // 2个参数  => 不够,不会算 任然要求传入参数
    console.log("res",res);





</script>
</html>